package com.hehe.filter;

import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.hehe.powernode.constant.AuthConstants;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**
 * （10）Feign拦截器
 * 分布式架构Spring Cloud中如果想通过Feign接口的调用隐式的传递一些参数，
 * 比如 用户ID、用户名称、身份认证等问题，
 * 就需要通过实现RequestInterceptor拦截器来实现。
 * 由于分布式架构中每一个业务模块都是需要验证请求的身份信息，
 * 所以通过feign拦截器来实现请求身份的认证。
 */
@Slf4j
@Component
public class FeignInterceptor implements RequestInterceptor {
    /**
     * @param requestTemplate 即将要发起新的请求的请求对象
     */
    @Override
    public void apply(RequestTemplate requestTemplate) {
       // 获取当前请求的上下文
        ServletRequestAttributes requestAttributes =(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (!ObjectUtils.isNotEmpty(requestAttributes)){
//            requestTemplate.header(AuthConstants.AUTHORIZATION,AuthConstants.BEARER+"ea2e88e9-907e-44f4-8111-ffc91057e095");
            return;
        }
        // 将当前请求对象头里的token传递到下一个请求对象的请求头中
        HttpServletRequest request = requestAttributes.getRequest();
        if (!ObjectUtils.isNotEmpty(request)){
            return;
        }
        // 获取当前请求头中的token值，传递到一下一个请求对象的请求头中
        String authorization = request.getHeader(AuthConstants.AUTHORIZATION);
        requestTemplate.header(AuthConstants.AUTHORIZATION,authorization);

    }
}
